package thread;

/**
 * 守护线程
 * @author ：Jobs Steve
 * 我们创建的线程都是用户线程，守护线程是通过用户线程调用setDaemon(true)设置
 * 而转变的
 * 操作系统要求一个进程中所有的用户线程都需要结束时，进程就需要结束，此时进程会杀死所有的线程
 * 还在运行的守护线程
 */
public class DaemonThreadDemo {
    public static void main(String[] args) {

        Thread rose = new Thread(()->{

                for(int i = 0; i < 4; i++){
                    System.out.println("rose: let go!");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println("rose:啊啊啊啊啊AAAaaaa");
                System.out.println("rose:扑通");
        });

        Thread jack = new Thread(()->{
            while(true){
                try {
                    System.out.println("jack:you jump! i jump");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        rose.start();
        // 将jack设置为守护线程，必须在运行之前线程启动前
        jack.setDaemon(true);
        jack.start();

        // 主线程会先结束
        // 用户线程结束，程序才会结束
        System.out.println("main方法结束！");

        // 但是需要注意的点是：如果我们在主线程当中加入一个死循环
        // 那么主线程就会一直处于运行状态，那么守护线程也就无法结束
        // 守护线程不是专门的守护某个具体的线程，而是守护整个进程
        // 只有当所有的用户线程都结束了，守护线程才会结束
        while(true);
    }
}
